package org.youyee.game.utils
{
	import flash.display.DisplayObject;
	import flash.display.Sprite;
	import flash.geom.Point;
	import flash.utils.Dictionary;
	
	import org.youyee.game.displayArea.Area;
	import org.youyee.game.pathFinding.PathMap;
	import org.youyee.game.pathFinding.PathNode;

	/**
	 * 负责逻辑节点到物理位置的相关计算 
	 * @author youyee
	 * 
	 */	
	public class PositionCalculator
	{
		/**
		 * 45度斜角模式 
		 */		
		public static const MODE_45 = 0;
		
		/**
		 * 平视角模式 
		 */		
		public static const MODE_NORMAL = 1;
		
		/**
		 * 宽度值的一半 
		 */		
		public static var WIDTH_VALUE:Number = 35;
		
		/**
		 * 高度值的一半 
		 */		
		public static var HEIGHT_VALUE:Number = 17.5;
		
		/**
		 * 计算的模式 
		 */		
		public static var MODE:int = 0;
		
		private static var _queryCache:Object = {};
		
		/**
		 * 通过节点的逻辑坐标计算出实际的物理位置 
		 * @param nodeX 节点横轴坐标
		 * @param nodeY 节点纵轴坐标
		 * @return 物理位置
		 * 
		 */		
		public static function getPosition(nodeX:int, nodeY:int):Point
		{
			var key:String = nodeX + "_" + nodeY;
			if (_queryCache[key])
			{
				return _queryCache[key] as Point;
			}
			
			var p:Point = new Point(
				MODE == MODE_45 ? nodeX * WIDTH_VALUE - nodeY * WIDTH_VALUE : nodeX * WIDTH_VALUE,
				MODE == MODE_45 ? nodeX * HEIGHT_VALUE + nodeY * HEIGHT_VALUE : nodeY * HEIGHT_VALUE
			);
			
			_queryCache[key] = p;
			
			return p;
		}
		
		/**
		 * 通过鼠标的位置来计算节点 
		 * @param area 需要被计算的区域
		 * @return 返回计算得到的节点
		 * 
		 */		
		public static function getPathNodeByMousePosition(area:Area):PathNode
		{
			var r:Sprite = area.ruler;
			
			if (r)
			{
				var nodeX:int = int(r.mouseX / 10);
				var nodeY:int = int(r.mouseY / 10);
				
				return area.pathMap.getPathNodeByPosition(nodeX, nodeY, false);
			}
			
			return null;
		}
		
		/**
		 * 通过节点获取物理位置 
		 * @param pathNode 位置节点
		 * @return 物理位置
		 * 
		 */		
		public static function getPositionByPathNode(pathNode:PathNode):Point
		{
			return getPosition(pathNode.x, pathNode.y);
		}
		
		/**
		 * 通过节点设置物体的位置 
		 * @param obj 需要被设置的物体
		 * @param pathNode 位置节点
		 * 
		 */		
		public static function setObjectPositionByPathNode(obj:DisplayObject, pathNode:PathNode):void
		{
			if (!pathNode)
			{
				return ;	
			}
			
			var p:Point = getPositionByPathNode(pathNode);
			
			if (obj.x != p.x)
			{
				obj.x = p.x;
			}
			
			if (obj.y != p.y)
			{
				obj.y = p.y;
			}
			
			p = null;
		}
		
		/**
		 * 清除缓存 
		 * 
		 */		
		public static function clearQueryCache():void
		{
			_queryCache = {};
		}
	}
}